From ef053b3f175a9b7a738e8433d3149722a6964f08 Mon Sep 17 00:00:00 2001 From: robertl Date: Tue, 30 Nov 2004 17:03:31 +0000 Subject: [PATCH] Fixes for mps mergout when record size isn't multiple of internal buffer size. From Paul Merchant. --- gpsbabel/mapsource.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/gpsbabel/mapsource.c b/gpsbabel/mapsource.c index d303814ac..c4f0f1ade 100644 --- a/gpsbabel/mapsource.c +++ b/gpsbabel/mapsource.c @@ -1912,6 +1912,8 @@ mps_write(void) int reclen; int reclen2; unsigned int tocopy; + unsigned int block; + long tempFilePos; unsigned int mpsWptClass; @@ -1988,9 +1990,10 @@ mps_write(void) fseek(mps_file_temp, tempFilePos, SEEK_SET); /* copy the data using a "reasonably" sized buffer */ - for(tocopy = reclen2; tocopy > 0; tocopy -= sizeof(copybuf)) { - fread(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_temp); - fwrite(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_out); + for(tocopy = reclen2; tocopy > 0; tocopy -= block) { + block = (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy); + fread(copybuf, block, 1, mps_file_temp); + fwrite(copybuf, block, 1, mps_file_out); } } else break; @@ -2026,6 +2029,7 @@ mps_write(void) /* prior to writing any tracks as requested, if we're doing a merge, read in the rtes from the original file and then write them out, ready for tracks to follow */ + /* if ((mpsmergeout) && (global_opts.objective != rtedata)) { */ if ((mpsmergeout) && (! doing_rtes)) { while (!feof(mps_file_temp)) { @@ -2035,9 +2039,11 @@ mps_write(void) fwrite(&reclen, 4, 1, mps_file_out); /* write out untouched */ fwrite(&recType, 1, 1, mps_file_out); - for(tocopy = reclen2; tocopy > 0; tocopy -= sizeof(copybuf)) { - fread(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_temp); - fwrite(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_out); + /* copy the data using a "reasonably" sized buffer */ + for(tocopy = reclen2; tocopy > 0; tocopy -= block) { + block = (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy); + fread(copybuf, block, 1, mps_file_temp); + fwrite(copybuf, block, 1, mps_file_out); } } else break; @@ -2095,9 +2101,11 @@ mps_write(void) fwrite(&reclen, 4, 1, mps_file_out); /* write out untouched */ fwrite(&recType, 1, 1, mps_file_out); - for(tocopy = reclen2; tocopy > 0; tocopy -= sizeof(copybuf)) { - fread(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_temp); - fwrite(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_out); + /* copy the data using a "reasonably" sized buffer */ + for(tocopy = reclen2; tocopy > 0; tocopy -= block) { + block = (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy); + fread(copybuf, block, 1, mps_file_temp); + fwrite(copybuf, block, 1, mps_file_out); } } else break; @@ -2140,10 +2148,13 @@ mps_write(void) fwrite(&reclen, 4, 1, mps_file_out); /* write out untouched */ fwrite(&recType, 1, 1, mps_file_out); - for(tocopy = reclen2; tocopy > 0; tocopy -= sizeof(copybuf)) { - fread(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_temp); - fwrite(copybuf, (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy), 1, mps_file_out); + /* copy the data using a "reasonably" sized buffer */ + for(tocopy = reclen2; tocopy > 0; tocopy -= block) { + block = (tocopy > sizeof(copybuf) ? sizeof(copybuf) : tocopy); + fread(copybuf, block, 1, mps_file_temp); + fwrite(copybuf, block, 1, mps_file_out); } + if (recType != 'V') { fread(&reclen, 4, 1, mps_file_temp); reclen2 = le_read32(&reclen); -- 2.30.2